jwt的攻击手法有哪些?
JWT攻击的九种手法:
空加密算法
JWT支持使用空加密算法,可以在header中指定alg为
None
,这样的话,只要把signature设置为空(即不添加signature字段),提交到服务器,任何token都可以通过服务器的验证。空加密算法的设计初衷是用于调试的,但是如果某天开发人员脑阔瓦特了,在生产环境中开启了空加密算法,缺少签名算法,jwt保证信息不被篡改的功能就失效了。攻击者只需要把alg字段设置为None,就可以在payload中构造身份信息,伪造用户身份。修改RSA加密算法为HMAC
JWT中最常用的两种算法为
HMAC
和RSA
。HMAC
是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,它是一种对称加密算法,使用相同的密钥对传输信息进行加解密。RSA
则是一种非对称加密算法,使用私钥加密明文,公钥解密密文。在HMAC和RSA算法中,都是使用私钥对signature
字段进行签名,只有拿到了加密时使用的私钥,才有可能伪造token。爆破密钥
JWT的密钥爆破需要在一定的前提下进行:
知悉JWT使用的加密算法
一段有效的、已签名的token
签名用的密钥不复杂(弱密钥)
所以其实JWT密钥爆破的局限性很大。简单的字母数字组合都是可以爆破的,但是密钥位数稍微长一点或者更复杂一点的话,爆破时间就会需要很久。
修改KID参数
kid
是jwt header中的一个可选参数,全称是key ID
,它用于指定加密算法的密钥。因为该参数可以由用户输入,所以也可能造成一些安全问题。任意文件读取
kid参数用于读取密钥文件,但系统并不会知道用户想要读取的到底是不是密钥文件,所以,如果在没有对参数进行过滤的前提下,攻击者是可以读取到系统的任意文件的。
SQL注入
kid
也可以从数据库中提取数据,这时候就有可能造成SQL注入攻击,通过构造SQL语句来获取数据或者是绕过signature的验证。命令注入
对
kid
参数过滤不严也可能会出现命令注入问题,但是利用条件比较苛刻。如果服务器后端使用的是Ruby,在读取密钥文件时使用了open
函数,通过构造参数就可能造成命令注入。对于其他的语言,例如php,如果代码中使用的是exec或者是system来读取密钥文件,那么同样也可以造成命令注入,当然这个可能性就比较小了。修改JKU/X5U参数
JKU
的全称是”JSON Web Key Set URL”,用于指定一组用于验证令牌的密钥的URL。类似于kid
,JKU
也可以由用户指定输入数据,如果没有经过严格过滤,就可以指定一组自定义的密钥文件,并指定web应用使用该组密钥来验证token。X5U
则以URI的形式数允许攻击者指定用于验证令牌的公钥证书或证书链,与JKU
的攻击利用方式类似。信息泄露
JWT保证的是数据传输过程中的完整性而不是机密性。由于payload是使用
base64url
编码的,所以相当于明文传输,如果在payload中携带了敏感信息(如存放密钥对的文件路径),单独对payload部分进行base64url
解码,就可以读取到payload中携带的信息。